package br.com.werp.regras.documento;

import java.util.List;

import br.com.werp.regras.documento.controle.ControleDocumento;
import br.com.werp.regras.documento.controle.ControleDominio;
import br.com.werp.regras.documento.controle.ControleImposto;
import br.com.werp.regras.documento.controle.ControlePagamento;
import br.com.werp.regras.documento.controle.ControleVencimento;
import br.com.werp.regras.geral.ErroPadrao;
import br.com.werp.regras.geral.GerenciadorErros;
import br.com.werp.regras.geral.GerenciamentoDocumento;
import br.com.werp.regras.geral.util.Dia;
import br.com.werp.regras.geral.vos.documento.DocumentoDominioVO;
import br.com.werp.regras.geral.vos.documento.DocumentoFinanceiroVO;
import br.com.werp.regras.geral.vos.documento.DocumentoImpostoVO;
import br.com.werp.regras.geral.vos.documento.DocumentoPagamentoVO;
import br.com.werp.regras.geral.vos.documento.DocumentoVO;
import br.com.werp.regras.geral.vos.documento.DocumentoVencimentoPesquisaVO;
import br.com.werp.regras.geral.vos.documento.DocumentoVencimentoVO;
import br.com.werp.regras.geral.vos.tabelas.Agrupamento_documento;
import br.com.werp.regras.geral.vos.tabelas.Documento;


/**
 * @author Sobreira
 * Criado em 14/06/2006
 */
public class GerenciamentoDocumentoImpl implements GerenciamentoDocumento {
    private static GerenciamentoDocumentoImpl gerenciamentoDocumentoImpl;
    private ControleVencimento controleVencimento = new ControleVencimento();
    private ControleDocumento controleDocumento = new ControleDocumento();
    private ControleImposto controleImposto = new ControleImposto();
    private ControlePagamento controlePagamento = new ControlePagamento();
    private ControleDominio controleDominio = new ControleDominio();

    private GerenciamentoDocumentoImpl() {
    }

    public static GerenciamentoDocumentoImpl getGerenciamentoDocumentoImpl() {
        if (gerenciamentoDocumentoImpl == null) {
            gerenciamentoDocumentoImpl = new GerenciamentoDocumentoImpl();
        }

        return gerenciamentoDocumentoImpl;
    }

    public void salvarDocumentoFinanceiro(Object key,
        DocumentoFinanceiroVO documentoFinanceiroVO, String usuario)
        throws ErroPadrao {
        try {
            controleDocumento.salvarDocumentoFinanceiro(key,
                documentoFinanceiroVO, usuario);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    public void salvarDocumentoFinanceiro(
        DocumentoFinanceiroVO documentoFinanceiroVO, String usuario)
        throws ErroPadrao {
        try {
            controleDocumento.salvarDocumentoFinanceiro(documentoFinanceiroVO,
                usuario);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    public List obeterDocumentoFinanceiroVO(
        DocumentoFinanceiroVO documentoFinanceiroVO) throws ErroPadrao {
        try {
            return controleDocumento.obeterDocumentoFinanceiroVO(documentoFinanceiroVO);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    public void salvarVenciementos(Object key,
        DocumentoFinanceiroVO documentoFinanceiroVO, List vencimentos,
        String usuario) throws ErroPadrao {
        try {
            controleVencimento.salvarVenciementos(key, documentoFinanceiroVO,
                vencimentos, usuario);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    public List obterVencimentos(int documentAgrupador)
        throws ErroPadrao {
        try {
            return controleVencimento.obterVencimentos(null, documentAgrupador);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    public List obterVencimentos(Object key, int documentAgrupador)
        throws ErroPadrao {
        try {
            return controleVencimento.obterVencimentos(key, documentAgrupador);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    public void salvarDocumentoImpostoAgrupadoDocFinanceiro(Object key,
        String usuario, DocumentoFinanceiroVO documentoFinanceiroVO,
        DocumentoImpostoVO documentoImpostoVO) throws ErroPadrao {
        try {
            controleImposto.salvarDocumentoImpostoAgrupadoDocFinanceiro(key,
                usuario, documentoFinanceiroVO, documentoImpostoVO);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    public List obterDocumentoImposto(int documentoAgrupador)
        throws ErroPadrao {
        try {
            return controleImposto.obterDocumentoImposto(documentoAgrupador);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    public void removerDocumentoImpostoAgrupadoDocFinanceiro(Object key,
        String usuario, DocumentoFinanceiroVO documentoFinanceiroVO,
        List documentosImposto) throws ErroPadrao {
        try {
            controleImposto.removerDocumentoImpostoAgrupadoDocFinanceiro(key,
                usuario, documentoFinanceiroVO, documentosImposto);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    public List pesquisarVencimentosVO(String dtVencInicio, String dtVencFim,
        DocumentoVencimentoPesquisaVO documentoVencimentoPesquisaVO)
        throws ErroPadrao {
        try {
            return controleVencimento.pesquisarVencimentosVO(dtVencInicio,
                dtVencFim, documentoVencimentoPesquisaVO);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    public int obeterDocumentoRaiz(int docm_id) throws ErroPadrao {
        try {
            return controleDocumento.obeterDocumentoRaiz(docm_id);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    public void salvarDocumentoPagamentoAgrupadoDocFinanceiro(Object key,
        String usuario, DocumentoFinanceiroVO documentoFinanceiroVO,
        DocumentoPagamentoVO documentoPagamentoVO) throws ErroPadrao {
        try {
            controlePagamento.salvarDocumentoPagamentoAgrupadoDocFinanceiro(key,
                usuario, documentoFinanceiroVO, documentoPagamentoVO);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }


    public List obterPagamentos(int docm_id) throws ErroPadrao {
        try {
            return controlePagamento.obterPagamentos(docm_id);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    public void agruparDocumento(Object key, String usuario, int agrupador,
        int agrupado) throws ErroPadrao {
        try {
            controleDocumento.agruparDocumento(key, usuario, agrupador, agrupado);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    public DocumentoVencimentoVO obterVencimentoAgrupador(int documentoAgrupado)
        throws ErroPadrao {
        try {
            return controleVencimento.obterVencimentoAgrupador(documentoAgrupado);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    public DocumentoFinanceiroVO obterDocumentoFinanceiroAgrupador(
        int documentoAgrupado) throws ErroPadrao {
        try {
            return controleDocumento.obterDocumentoFinanceiroAgrupador(documentoAgrupado);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    public void salvarDocumento(Object key, String usuario, Documento documento)
        throws ErroPadrao {
        try {
            controleDocumento.salvarDocumento(key, usuario, documento);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    public String obterIdTipoDocumento(String tipoDesc, String dominioDesc)
        throws ErroPadrao {
        try {
            return controleDocumento.obterIdTipoDocumento(tipoDesc, dominioDesc);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    public String obterTipoDocumento(DocumentoVO documentoVO)
        throws ErroPadrao {
        try {
            return controleDocumento.obterTipoDocumento(documentoVO);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    public List pesquisarDocumentoImpostoVO(
        DocumentoImpostoVO documentoImpostoVO) throws ErroPadrao {
        try {
            return controleImposto.pesquisarDocumentoImpostoVO(documentoImpostoVO);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    public List obeterDocumentoFinanceiroVO(
        DocumentoFinanceiroVO documentoFinanceiroVO, Dia dataInicio, Dia dataFim)
        throws ErroPadrao {
        try {
            return controleDocumento.obeterDocumentoFinanceiroVO(documentoFinanceiroVO,
                dataInicio, dataFim);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    public int obterNumeroParcelaVencimento(
        DocumentoFinanceiroVO financeiroVO, DocumentoVencimentoVO vencimentoVO)
        throws ErroPadrao {
        try {
            return controleVencimento.obterNumeroParcelaVencimento(financeiroVO,
                vencimentoVO);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    public List obterDocumentoVoTabela(Documento documento)
        throws ErroPadrao {
        try {
            return controleDocumento.obterDocumentoVoTabela(documento);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    public void verificaDocumentoVOCancelado(DocumentoVO documentoVO)
        throws ErroPadrao {
        try {
            controleDocumento.verificaDocumentoVOCancelado(documentoVO);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    public void verificaDocumentoVOCancelado(Object key, DocumentoVO documentoVO)
        throws ErroPadrao {
        try {
            controleDocumento.verificaDocumentoVOCancelado(key, documentoVO);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    public void apagarDocumentoPagamento(int docm_id, String usuario)
        throws ErroPadrao {
        try {
            controlePagamento.apagarDocumentoPagamento(docm_id, usuario);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    public List obterAgrupamentoDocumentoVoTabela(
        Agrupamento_documento agrupamento_documento) throws ErroPadrao {
        try {
            return controleDocumento.obterAgrupamentoDocumento(agrupamento_documento);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    public List pesquisarDocumentoDominioVO(
        DocumentoDominioVO documentoDominioVO) throws ErroPadrao {
        try {
            return controleDominio.pesquisarDocumentoDominioVO(documentoDominioVO);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }
}
